import tkinter as tk
from tkinter import ttk, messagebox
import time
import datetime

class TimestampConverter:
    def __init__(self, root):
        self.root = root
        self.root.title("时间戳转换工具")
        self.root.geometry("600x400")
        self.root.resizable(True, True)
        
        # 设置中文字体支持
        self.style = ttk.Style()
        self.style.configure("TLabel", font=("SimHei", 10))
        self.style.configure("TButton", font=("SimHei", 10))
        self.style.configure("TEntry", font=("SimHei", 10))
        
        # 创建主框架
        self.main_frame = ttk.Frame(root, padding="20")
        self.main_frame.pack(fill=tk.BOTH, expand=True)
        
        # 时间戳输入区域
        ttk.Label(self.main_frame, text="时间戳:").grid(row=0, column=0, sticky=tk.W, pady=5)
        self.timestamp_var = tk.StringVar()
        self.timestamp_entry = ttk.Entry(self.main_frame, textvariable=self.timestamp_var, width=30)
        self.timestamp_entry.grid(row=0, column=1, sticky=tk.W, pady=5)
        
        # 时间格式选择
        ttk.Label(self.main_frame, text="时间格式:").grid(row=1, column=0, sticky=tk.W, pady=5)
        self.time_format_var = tk.StringVar(value="%Y-%m-%d %H:%M:%S")
        self.time_format_combo = ttk.Combobox(
            self.main_frame, 
            textvariable=self.time_format_var,
            values=[
                "%Y-%m-%d %H:%M:%S",
                "%Y/%m/%d %H:%M:%S",
                "%Y年%m月%d日 %H时%M分%S秒",
                "%Y-%m-%d",
                "%H:%M:%S"
            ],
            width=27
        )
        self.time_format_combo.grid(row=1, column=1, sticky=tk.W, pady=5)
        
        # 日期时间输入区域
        ttk.Label(self.main_frame, text="日期时间:").grid(row=2, column=0, sticky=tk.W, pady=5)
        self.datetime_var = tk.StringVar()
        self.datetime_entry = ttk.Entry(self.main_frame, textvariable=self.datetime_var, width=30)
        self.datetime_entry.grid(row=2, column=1, sticky=tk.W, pady=5)
        
        # 时间戳单位选择
        ttk.Label(self.main_frame, text="时间戳单位:").grid(row=3, column=0, sticky=tk.W, pady=5)
        self.unit_var = tk.StringVar(value="秒 (10位)")
        self.unit_frame = ttk.Frame(self.main_frame)
        self.unit_frame.grid(row=3, column=1, sticky=tk.W, pady=5)
        
        ttk.Radiobutton(
            self.unit_frame, 
            text="秒 (10位)", 
            variable=self.unit_var, 
            value="秒 (10位)"
        ).pack(side=tk.LEFT, padx=5)
        
        ttk.Radiobutton(
            self.unit_frame, 
            text="毫秒 (13位)", 
            variable=self.unit_var, 
            value="毫秒 (13位)"
        ).pack(side=tk.LEFT, padx=5)
        
        # 按钮区域
        self.button_frame = ttk.Frame(self.main_frame)
        self.button_frame.grid(row=4, column=0, columnspan=2, pady=15)
        
        ttk.Button(
            self.button_frame, 
            text="时间戳 -> 日期时间", 
            command=self.timestamp_to_datetime
        ).pack(side=tk.LEFT, padx=10)
        
        ttk.Button(
            self.button_frame, 
            text="日期时间 -> 时间戳", 
            command=self.datetime_to_timestamp
        ).pack(side=tk.LEFT, padx=10)
        
        ttk.Button(
            self.button_frame, 
            text="获取当前时间", 
            command=self.get_current_time
        ).pack(side=tk.LEFT, padx=10)
        
        # 信息显示区域
        ttk.Label(self.main_frame, text="转换结果:").grid(row=5, column=0, sticky=tk.NW, pady=5)
        self.result_text = tk.Text(self.main_frame, height=6, width=40, font=("SimHei", 10))
        self.result_text.grid(row=5, column=1, sticky=tk.W, pady=5)
        
        # 添加说明文本
        self.info_text = tk.Text(
            self.main_frame, 
            height=4, 
            width=60, 
            font=("SimHei", 9),
            wrap=tk.WORD,
            state=tk.DISABLED
        )
        self.info_text.grid(row=6, column=0, columnspan=2, pady=10)
        self.info_text.config(state=tk.NORMAL)
        self.info_text.insert(tk.END, "说明:\n1. 时间戳是从1970年1月1日00:00:00 UTC开始计算的秒数或毫秒数\n")
        self.info_text.insert(tk.END, "2. 可以自定义时间格式，例如: %Y-%m-%d %H:%M:%S\n")
        self.info_text.insert(tk.END, "3. 点击'获取当前时间'可自动填充当前时间和时间戳")
        self.info_text.config(state=tk.DISABLED)
        
        # 调整列宽
        self.main_frame.columnconfigure(1, weight=1)
        
    def timestamp_to_datetime(self):
        """将时间戳转换为日期时间"""
        try:
            timestamp_str = self.timestamp_var.get().strip()
            if not timestamp_str:
                messagebox.showwarning("警告", "请输入时间戳")
                return
                
            # 转换为数值
            timestamp = float(timestamp_str)
            
            # 根据单位转换
            if self.unit_var.get() == "毫秒 (13位)":
                timestamp = timestamp / 1000
                
            # 转换为本地时间
            local_time = time.localtime(timestamp)
            formatted_time = time.strftime(self.time_format_var.get(), local_time)
            
            # 转换为UTC时间
            utc_time = time.gmtime(timestamp)
            formatted_utc_time = time.strftime(self.time_format_var.get(), utc_time)
            
            # 更新日期时间输入框
            self.datetime_var.set(formatted_time)
            
            # 显示结果
            self.result_text.delete(1.0, tk.END)
            self.result_text.insert(tk.END, f"本地时间: {formatted_time}\n")
            self.result_text.insert(tk.END, f"UTC时间: {formatted_utc_time}\n")
            self.result_text.insert(tk.END, f"时间戳 (秒): {int(timestamp)}\n")
            self.result_text.insert(tk.END, f"时间戳 (毫秒): {int(timestamp * 1000)}")
            
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字作为时间戳")
        except Exception as e:
            messagebox.showerror("错误", f"转换失败: {str(e)}")
    
    def datetime_to_timestamp(self):
        """将日期时间转换为时间戳"""
        try:
            datetime_str = self.datetime_var.get().strip()
            if not datetime_str:
                messagebox.showwarning("警告", "请输入日期时间")
                return
                
            # 解析日期时间
            dt = datetime.datetime.strptime(datetime_str, self.time_format_var.get())
            
            # 转换为时间戳（秒）
            timestamp = time.mktime(dt.timetuple())
            
            # 根据单位显示
            if self.unit_var.get() == "毫秒 (13位)":
                timestamp_ms = int(timestamp * 1000)
                self.timestamp_var.set(str(timestamp_ms))
            else:
                self.timestamp_var.set(str(int(timestamp)))
            
            # 显示结果
            self.result_text.delete(1.0, tk.END)
            self.result_text.insert(tk.END, f"时间戳 (秒): {int(timestamp)}\n")
            self.result_text.insert(tk.END, f"时间戳 (毫秒): {int(timestamp * 1000)}\n")
            self.result_text.insert(tk.END, f"本地时间: {dt.strftime(self.time_format_var.get())}\n")
            
        except ValueError:
            messagebox.showerror("错误", f"请输入与格式 '{self.time_format_var.get()}' 匹配的日期时间")
        except Exception as e:
            messagebox.showerror("错误", f"转换失败: {str(e)}")
    
    def get_current_time(self):
        """获取当前时间并填充到输入框"""
        # 获取当前时间戳（秒）
        current_timestamp = time.time()
        
        # 根据单位显示
        if self.unit_var.get() == "毫秒 (13位)":
            self.timestamp_var.set(str(int(current_timestamp * 1000)))
        else:
            self.timestamp_var.set(str(int(current_timestamp)))
        
        # 获取当前时间并格式化
        current_time = time.localtime(current_timestamp)
        formatted_time = time.strftime(self.time_format_var.get(), current_time)
        self.datetime_var.set(formatted_time)
        
        # 显示结果
        self.result_text.delete(1.0, tk.END)
        self.result_text.insert(tk.END, f"当前本地时间: {formatted_time}\n")
        self.result_text.insert(tk.END, f"当前UTC时间: {time.strftime(self.time_format_var.get(), time.gmtime(current_timestamp))}\n")
        self.result_text.insert(tk.END, f"当前时间戳 (秒): {int(current_timestamp)}\n")
        self.result_text.insert(tk.END, f"当前时间戳 (毫秒): {int(current_timestamp * 1000)}")

if __name__ == "__main__":
    root = tk.Tk()
    app = TimestampConverter(root)
    root.mainloop()
